﻿using System;

namespace V8.Net
{
    // ========================================================================================================================

    /// <summary>
    /// 描述JavaScript属性的标志。 必须根据需要将它们“或”在一起。
    /// </summary>
    [Flags]
    public enum V8PropertyAttributes
    {
        /// <summary>
        /// 没有有效的属性（与“无”不同，后者“明确地”定义未设置任何属性）。
        /// 本地PROXY（不是V8）将解释为“让V8继续默认行为”。
        /// 警告：不能与其他枚举值按位“或”运算。
        /// </summary>
        Undefined = -1,

        /// <summary>
        /// 未设置任何属性-保留未设置的所有属性的默认行为。
        /// 注意：在检查对象属性的属性时，如果属性不存在，则V8将返回“无”。
        /// “未定义”仅适用于V8.Net（与拦截器回调/挂钩一起使用）。
        /// </summary>
        None = 0,

        /// <summary>
        /// 该属性只读
        /// </summary>
        ReadOnly = 1 << 0,

        /// <summary>
        /// 该属性是可见的，但枚举不返回
        /// </summary>
        DontEnum = 1 << 1,

        /// <summary>
        /// 该属性无法删除
        /// </summary>
        DontDelete = 1 << 2,

        /// <summary>
        /// 这等于"ReadOnly|DontDelete",并且是V8.NET特定的属性名称.
        /// 这是因为在添加一些固定的全局类型和对象时，锁定属性是常见的操作。
        /// </summary>
        Locked = ReadOnly | DontDelete
    };

    // ========================================================================================================================

    /// <summary>
    /// V8访问控制规范标志。
    /// 如果某些访问器应可跨本机V8上下文访问，则这些访问器需要一个明确的访问控制参数集，该参数集指定应允许的跨上下文访问的类型。
    /// </summary>
    [Flags]
    public enum V8AccessControl
    {
        /// <summary>
        /// 没有有效的访问值（与“默认”不同，“默认”明确地定义为使用默认行为）。
        /// 注意：此值由V8.NET内部使用，不属于本机V8系统。
        /// </summary>
        Undefined = -1,

        /// <summary>
        /// 保留默认行为'未设置标志'
        /// </summary>
        Default = 0,

        /// <summary>
        /// 可以从所有上下文读取该属性
        /// </summary>
        AllCanRead = 1 << 0,

        /// <summary>
        /// 可以在所有上下文中写入该属性
        /// </summary>
        AllCanWrite = 1 << 1,

        /// <summary>
        /// 访问器不能被其他上下文替换
        /// </summary>
        ProhibitsOverwriting = 1 << 2
    };

    // ========================================================================================================================

    /// <summary>
    /// JavaScript值的类型从本机端整理。
    /// </summary>
    public enum JSValueType : int
    {
        /// <summary>
        /// 尝试执行已编译的脚本时发生错误。
        /// </summary>
        ExecutionError = -2,

        /// <summary>
        /// 编译脚本时发生错误（通常是语法错误）。
        /// </summary>
        CompilerError = -3,

        /// <summary>
        /// 发生内部错误（在脚本执行之前或之后）。
        /// </summary>
        InternalError = -1,

        /// <summary>该值是不确定的（未设置值）。 这与“ null”不同。</summary>
        Undefined = 0,

        /// <summary>该值为null（空对象引用）。 这与“未定义”（未设置值）不同。</summary>
        Null,

        /// <summary>该值是布尔值，JavaScript在true / false条件下支持该值。</summary>
        Bool,

        /// <summary>该值是布尔对象（对象引用），在执行“ new Boolean（）”时在JavaScript中受支持。</summary>
        BoolObject,

        /// <summary>该值是32位整数，JavaScript在位操作中支持此值。</summary>
        Int32,

        /// <summary>该值为JavaScript 64位数字。</summary>
        Number,

        /// <summary>该值是JavaScript 64位Number对象（对象引用），执行“ new Number（）”时在JavaScript中受支持。</summary>
        NumberObject,

        /// <summary>该值是UTF16字符串。</summary>
        String,

        /// <summary>
        /// 该值是JavaScript字符串对象(对象引用),在执行'new String()'时在JavaScript中受支持。
        /// </summary>
        StringObject,

        /// <summary>
        /// 该值是一个非值（对象引用）。
        /// </summary>
        Object,

        /// <summary>
        /// 该值是对JavaScript函数的引用（对象引用）。
        /// </summary>
        Function,

        /// <summary>
        /// 日期值是从纪元[1970-01-01 00:00:00 UTC + 00]起的毫秒数（存储在“数字”中的双精度值）。
        /// </summary>
        Date,

        /// <summary>
        /// 值代理表示各种值的JavaScript数组。
        /// </summary>
        Array,

        /// <summary>
        /// 值代理表示JavaScript正则表达式对象（对象引用）。
        /// </summary>
        RegExp,
    }

    // ========================================================================================================================

    /// <summary>
    /// 本机代理对象的类型（仅适用于本机类实例）。
    /// </summary>
    public enum ProxyObjectType
    {
        Undefined,
        ObjectTemplateProxyClass,
        FunctionTemplateProxyClass,
        V8EngineProxyClass,
        HandleProxyClass
    };

    // ========================================================================================================================
}
